home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / png / pnglib06 / pngtrans.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-01  |  3.9 KB  |  184 lines

  1.  
  2. /* pngtrans.c - transforms the data in a row
  3.    routines used by both readers and writers
  4.  
  5.    pnglib version 0.6
  6.    For conditions of distribution and use, see copyright notice in png.h
  7.    Copyright (c) 1995 Guy Eric Schalnat, Group 42, Inc.
  8.    May 1, 1995
  9.    */
  10.  
  11. #define PNG_INTERNAL
  12. #include "png.h"
  13.  
  14. /* turn on bgr to rgb mapping */
  15. void
  16. png_set_bgr(png_struct *png_ptr)
  17. {
  18.    png_ptr->transformations |= PNG_BGR;
  19. }
  20.  
  21. /* turn on 16 bit byte swapping */
  22. void
  23. png_set_swap(png_struct *png_ptr)
  24. {
  25.    if (png_ptr->bit_depth == 16)
  26.       png_ptr->transformations |= PNG_SWAP_BYTES;
  27. }
  28.  
  29. /* turn on pixel packing */
  30. void
  31. png_set_packing(png_struct *png_ptr)
  32. {
  33.    if (png_ptr->bit_depth < 8)
  34.    {
  35.       png_ptr->transformations |= PNG_PACK;
  36.       png_ptr->usr_bit_depth = 8;
  37.    }
  38. }
  39.  
  40. void
  41. png_set_shift(png_struct *png_ptr, int true_bits)
  42. {
  43.    png_ptr->transformations |= PNG_SHIFT;
  44.    png_ptr->shift = true_bits;
  45. }
  46.  
  47. int
  48. png_set_interlace_handling(png_struct *png_ptr)
  49. {
  50.    if (png_ptr->interlaced)
  51.    {
  52.       png_ptr->transformations |= PNG_INTERLACE;
  53.       return 7;
  54.    }
  55.  
  56.    return 1;
  57. }
  58.  
  59. void
  60. png_set_rgbx(png_struct *png_ptr)
  61. {
  62.    png_ptr->transformations |= PNG_RGBA;
  63.    if (png_ptr->color_type == PNG_COLOR_TYPE_RGB &&
  64.       png_ptr->bit_depth == 8)
  65.       png_ptr->usr_channels = 4;
  66. }
  67.  
  68. void
  69. png_set_invert_mono(png_struct *png_ptr)
  70. {
  71.    png_ptr->transformations |= PNG_INVERT_MONO;
  72. }
  73.  
  74. /* invert monocrome grayscale data */
  75. void
  76. png_do_invert(png_row_info *row_info, png_byte *row)
  77. {
  78.    if (row && row_info && row_info->bit_depth == 1 &&
  79.       row_info->color_type == PNG_COLOR_TYPE_GRAY)
  80.    {
  81.       png_byte *rp;
  82.       png_uint_32 i;
  83.  
  84.       for (i = 0, rp = row;
  85.          i < row_info->rowbytes;
  86.          i++, rp++)
  87.       {
  88.          *rp = ~(*rp);
  89.       }
  90.    }
  91. }
  92.  
  93. /* swaps byte order on 16 bit depth images */
  94. void
  95. png_do_swap(png_row_info *row_info, png_byte *row)
  96. {
  97.    if (row && row_info && row_info->bit_depth == 16)
  98.    {
  99.       png_byte *rp, t;
  100.       png_uint_32 i;
  101.  
  102.       for (i = 0, rp = row;
  103.          i < row_info->width * row_info->channels;
  104.          i++, rp += 2)
  105.       {
  106.          t = *rp;
  107.          *rp = *(rp + 1);
  108.          *(rp + 1) = t;
  109.       }
  110.    }
  111. }
  112.  
  113. /* swaps red and blue */
  114. void
  115. png_do_bgr(png_row_info *row_info, png_byte *row)
  116. {
  117.    if (row && row_info && (row_info->color_type & 2))
  118.    {
  119.       if (row_info->color_type == 2 && row_info->bit_depth == 8)
  120.       {
  121.          png_byte *rp, t;
  122.          png_uint_32 i;
  123.  
  124.          for (i = 0, rp = row;
  125.             i < row_info->width;
  126.             i++, rp += 3)
  127.          {
  128.             t = *rp;
  129.             *rp = *(rp + 2);
  130.             *(rp + 2) = t;
  131.          }
  132.       }
  133.       else if (row_info->color_type == 6 && row_info->bit_depth == 8)
  134.       {
  135.          png_byte *rp, t;
  136.          png_uint_32 i;
  137.  
  138.          for (i = 0, rp = row;
  139.             i < row_info->width;
  140.             i++, rp += 4)
  141.          {
  142.             t = *rp;
  143.             *rp = *(rp + 2);
  144.             *(rp + 2) = t;
  145.          }
  146.       }
  147.       else if (row_info->color_type == 2 && row_info->bit_depth == 16)
  148.       {
  149.          png_byte *rp, t[2];
  150.          png_uint_32 i;
  151.  
  152.          for (i = 0, rp = row;
  153.             i < row_info->width;
  154.             i++, rp += 6)
  155.          {
  156.             t[0] = *rp;
  157.             t[1] = *(rp + 1);
  158.             *rp = *(rp + 4);
  159.             *(rp + 1) = *(rp + 5);
  160.             *(rp + 4) = t[0];
  161.             *(rp + 5) = t[1];
  162.          }
  163.       }
  164.       else if (row_info->color_type == 6 && row_info->bit_depth == 8)
  165.       {
  166.          png_byte *rp, t[2];
  167.          png_uint_32 i;
  168.  
  169.          for (i = 0, rp = row;
  170.             i < row_info->width;
  171.             i++, rp += 8)
  172.          {
  173.             t[0] = *rp;
  174.             t[1] = *(rp + 1);
  175.             *rp = *(rp + 4);
  176.             *(rp + 1) = *(rp + 5);
  177.             *(rp + 4) = t[0];
  178.             *(rp + 5) = t[1];
  179.          }
  180.       }
  181.    }
  182. }
  183.  
  184.